package de.projectgoodmorning.alarm.storage;

import android.content.Context;
import android.util.Log;

import com.db4o.ObjectSet;

import de.projectgoodmorning.alarm.model.Configuration;

/**
 * Die ConfigStorage-Klasse ist die Schnittstelle zu den persistent
 * gespeicherten Konfigurationen. 
 */
public class ConfigStorage {
	private static final String TAG = ConfigStorage.class.getCanonicalName();
	
	private static final String STORAGE_FILE = "alarmstorage.db";
	private Db4oHelper dbAccess;

	/**
	 * erstellt eine neue Instanz
	 * @param context	benoetigt Context fuer den Zugriff auf Datenbank
	 */
	public ConfigStorage( Context context ) {
		dbAccess = new Db4oHelper( context, STORAGE_FILE );
	}
	
	/**
	 * gibt die hinterlegten Konfigurationen zurueck.
	 * Sollte keine Konfiguration in der Datenbank gefunden werden, wird eine
	 * Default-Konfiguration erstellt, gespeichert und zurueck gegeben.
	 * 
	 * @return		gibt Configurations-Objekt zurueck mit allen Einstellungen
	 */
	public Configuration getConfig() {
		ObjectSet<Object> result = dbAccess.db().queryByExample( Configuration.class );
		
		while( result.hasNext() ) {
			Log.i( TAG, "Configuration found." );
			return ( Configuration ) result.next();
		}
		
		Log.i( TAG, "New configuration created." );
		Configuration config = new Configuration();
		dbAccess.db().store( config );
		dbAccess.db().commit();
		
		return config;
	}
	
	/**
	 * legt eine bestimmten Konfiguration fest und speichert diese in 
	 * der Datenbank.
	 * 
	 * @param config	erwartet ein Configuration-Objekt
	 */
	public void setConfig( Configuration config ) {
		if( getConfig() != null ) {
			removeConfig();
		}
		
		Log.i( TAG, "Configuration changed." );
		dbAccess.db().store( config );
		dbAccess.db().commit();
	}
	
	/**
	 * entfernt die gesetzten Konfigurationen aus der Datenbank.
	 */
	public void removeConfig() {
		ObjectSet<Object> result = dbAccess.db().queryByExample( Configuration.class );
		
		while( result.hasNext() ) {
			dbAccess.db().delete( ( Configuration ) result.next() );
			dbAccess.db().commit();
		}
	}
}
